using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using DevComponents.DotNetBar;
using Waiter.Controler;
using Waiter.Common;
using Waiter.DataLayer;

namespace Waiter.View
{
    public partial class frmGroupList : DevComponents.DotNetBar.Office2007Form//Form
    {
        #region Variables *****************************************************************
        private const int I_MAX_LEN = 255;                                                  //số ký tự lớn nhất có thể input.
        private const int I_MIN_LEN = 1;                                                    //số ký tự nhỏ nhất có thể input.
        private string strInitGroupCode = string.Empty;                                     //group code đối số được truyền vào
            
        MasterCtrl masterCtrl = new MasterCtrl();           
        List<MASTER> gridDataSource = new List<MASTER>();                                   //Data source của grid
        delegate void dgSetColumnIndex(int a, int b);                                       //Delegate dùng để control vị trí của focus của cell
        dgSetColumnIndex myDelegate;                                                        //Thể hiện của delegate
        public delegate void CloseForm();                                                   //Delegate close form
        public CloseForm myCloseForm;                                                       //Tạo thể hiện của delegate

        #endregion

        public frmGroupList()
        {
            InitializeComponent();
        }

        public frmGroupList(string pGroupCode)
        {
            InitializeComponent();
            strInitGroupCode = pGroupCode;
        }

        #region Events ********************************************************************

        /// <summary>
        /// Khi load form thì thực hiện load ComboBox danh mục và load grid Item.
        /// </summary>
        /// <history>Verion: 1.0.0.0 - TRAN_DANG_QUANG</history>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void frmGroupList_Load(object sender, EventArgs e)
        {
            CommonLogging.fsWriteLog(CommonConstants.LOG_TYPE_INFO, "frmGroupList.frmGroupList_Load", "", "");

            //Load data vào ComboBox.
            masterCtrl.fsLoadCmbGroupList(cmbGroupList);
            if (strInitGroupCode != string.Empty)
            {
                cmbGroupList.SelectedValue = strInitGroupCode;//Setting trị mặc định cho commbobox
                cmbGroupList.Enabled = false;//Không cho chọn lại các setting khác
            }

            //Load data tương ứng vào grid.
            fsReloadGrid();

            //Thêm sự kiện cho các control
            this.grdItem.CellEndEdit += new System.Windows.Forms.DataGridViewCellEventHandler(this.grdItem_CellEndEdit);

            myDelegate = new dgSetColumnIndex(fsSetColumnIndex);
        }

        /// <summary>
        /// Khi thay đổi group được chọn thì sẽ load lại danh sách item
        /// </summary>
        /// <history>Verion: 1.0.0.0 - TRAN_DANG_QUANG</history>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void cmbGroupList_SelectedIndexChanged(object sender, EventArgs e)
        {
            CommonLogging.fsWriteLog(CommonConstants.LOG_TYPE_INFO, "frmGroupList.cmbGroupList_SelectedIndexChanged", "", "");

            //Load data tương ứng vào grid.
            fsReloadGrid();
            //Trường hợp group chỉ cho phép chỉnh sửa (không cho add thêm item)
            VIEW_MasterGroup_ComboBox myValue = (VIEW_MasterGroup_ComboBox)cmbGroupList.SelectedItem;
            if (myValue.CAN_ADD_NEW != null)
            {
                if (myValue.CAN_ADD_NEW == false)
                {
                    pnlAddNew.Enabled = false;
                    return;
                }
            }

            pnlAddNew.Enabled = true;
        }

        /// <summary>
        /// Add thêm item vào data source
        /// </summary>
        /// <history>Verion: 1.0.0.0 - TRAN_DANG_QUANG</history>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnAddItem_Click(object sender, EventArgs e)
        {
            CommonLogging.fsWriteLog(CommonConstants.LOG_TYPE_INFO, "frmGroupList.btnAddItem_Click", "", "");

            string strItemInput = txtItemName.Text;
            string strGroupCode = cmbGroupList.SelectedValue.ToString();
            bool IsSusccess = true;

            //CHECK ERROR**********************************************************************************************
            //Kiểm tra chiều dài item add thêm
            if (strItemInput.Length > I_MAX_LEN || strItemInput.Length < I_MIN_LEN)
            {
                MessageBoxEx.Show("Xin hãy nhập số ký tự từ 1-->255!\nSố ký tự hiện tại = " + strItemInput.Length, CommonMessages.MSG_NOTICE_TITLE, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return;
            }

            //Kiểm tra trùng
            if(masterCtrl.fsCheckExistValue(string.Empty, strGroupCode, strItemInput) == true)
            {
                MessageBoxEx.Show(CommonMessages.MSG_EXIST_ITEM, CommonMessages.MSG_NOTICE_TITLE, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return;
            }

            //Kiểm tra item nhập thì đã bị đặt cờ xóa hay không
            if (masterCtrl.fsCheckExistValue(string.Empty, strGroupCode, strItemInput) == true)
            {
                //Nếu có thì set cờ DEL_FLG = true
                if (masterCtrl.fsUnDelete(string.Empty, strGroupCode, strItemInput) == true)
                {
                    //Undelete thành công
                    IsSusccess = true;
                }
                else
                {
                    //Undelete không thành công
                    IsSusccess = false;
                }
            }
            else
            {
                if(masterCtrl.fsInsertData(String.Format(CommonConstants.CODE_DATE, DateTime.Now),
                                            cmbGroupList.SelectedValue.ToString(),
                                            cmbGroupList.Text,
                                            String.Format(CommonConstants.CODE_DATE, DateTime.Now),
                                            txtItemName.Text,
                                            false,
                                            CommonUtils.fsGetOPID(),
                                            DateTime.Now,
                                            DateTime.Now) == true)
                {
                    //Undelete thành công
                    IsSusccess = true;
                }
                else
                {
                    //Undelete không thành công
                    IsSusccess = false;
                }
            }

            //Xử lý kết thúc
            if (IsSusccess == true)
            {
                //Thành công thì load lại grid
                fsReloadGrid();
                txtItemName.Text = String.Empty;
            }
            else
            {
                //Thất bại thì hiển thị thông báo
                MessageBoxEx.Show(CommonMessages.MSG_DEL_FAIL, CommonMessages.MSG_ERR_TITLE, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }   

        /// <summary>
        /// Khi kết thúc edit thì kiểm tra xem trị tại cell đã edit có hợp lệ hay không.
        /// </summary>
        /// <history>Verion: 1.0.0.0 - TRAN_DANG_QUANG</history>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void grdItem_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            CommonLogging.fsWriteLog(CommonConstants.LOG_TYPE_INFO, "frmGroupList.grdItem_CellEndEdit", "", "");

            string strCellValue = string.Empty;//Get trị tại cell cần kiểm tra.
            if (grdItem.Rows[e.RowIndex].Cells[e.ColumnIndex].Value != null)
            {
                strCellValue = grdItem.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString();
            }            

            //Kiểm tra số ký tự
            if (strCellValue.Length > I_MAX_LEN || strCellValue.Length < I_MIN_LEN)
            {
                grdItem.CurrentCell.ErrorText = "Xin hãy nhập số ký tự từ 1-->255!\nSố ký tự hiện tại = " + strCellValue.Length;
            }
            else
            {
                grdItem.CurrentCell.ErrorText = string.Empty;
                grdItem.Rows[e.RowIndex].Cells["colUPD_DATE"].Value = DateTime.Now;
                grdItem.Rows[e.RowIndex].Cells["colOPID"].Value = CommonUtils.fsGetOPID();
            }
        }

        /// <summary>
        /// Lưu lại data
        /// </summary>
        /// <history>Verion: 1.0.0.0 - TRAN_DANG_QUANG</history>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSave_Click(object sender, EventArgs e)
        {
            CommonLogging.fsWriteLog(CommonConstants.LOG_TYPE_INFO, "frmGroupList.btnSave_Click", "", "");

            for (int i = 0; i < grdItem.Rows.Count; i++)
            {
                if (grdItem.Rows[i].Cells["colVALUE"].ErrorText != string.Empty)
                {
                    MessageBoxEx.Show("Xin hãy chắc chắn rằng tất cả các dòng dữ liệu đều hợp lệ!", CommonMessages.MSG_ERR_TITLE, MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
            }

            fsSaveData();
        }

        /// <summary>
        /// Đóng form
        /// </summary>
        /// <history>Verion: 1.0.0.0 - TRAN_DANG_QUANG</history>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnClose_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        /// <summary>
        /// Xóa data tại dòng được select
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnDelete_Click(object sender, EventArgs e)
        {
            CommonLogging.fsWriteLog(CommonConstants.LOG_TYPE_INFO, "frmGroupList.btnDelete_Click", "", "");

            fsDeleteSelectedRow();            
        }

        /// <summary>
        /// Load lại data
        /// </summary>
        /// <history>Verion: 1.0.0.0 - TRAN_DANG_QUANG</history>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnRefesh_Click(object sender, EventArgs e)
        {
            CommonLogging.fsWriteLog(CommonConstants.LOG_TYPE_INFO, "frmGroupList.btnRefesh_Click", "", "");

            Common.CommonGlobalVariable.globalDataContext = new CafeDBDataContext();

            //Load data vào grid.
            masterCtrl.fsLoadCmbGroupList(cmbGroupList);

            //Load data tương ứng vào grid.
            fsReloadGrid();
        }

        /// <summary>
        /// Khi đóng đang đóng
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void frmGroupList_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (myCloseForm != null)//Thông báo cho form menu
                myCloseForm();
        }

        #endregion 

        #region Method ********************************************************************
        /// <summary>
        /// Setting focus cell
        /// </summary>
        /// <history>Verion: 1.0.0.0 - TRAN_DANG_QUANG</history>
        private void fsSetColumnIndex(int pColumnIndex, int pRowIndex)
        {
            CommonLogging.fsWriteLog(CommonConstants.LOG_TYPE_INFO, "frmGroupList.fsSetColumnIndex", "", "");
            try
            {
                if (pColumnIndex != -1 && pRowIndex != -1)
                {
                    this.grdItem.CurrentCell = this.grdItem[pColumnIndex, pRowIndex];
                    grdItem.Rows[pRowIndex].Selected = true;
                }
            }
            catch (Exception ex)
            {
                CommonLogging.fsWriteLog(CommonConstants.LOG_TYPE_ERROR, "frmGroupList.fsSetColumnIndex", "", ex.ToString());
            }
        }

        /// <summary>
        /// Phương thức load lại data trên grid (ứng với groupd đang được chọn)
        /// </summary>
        /// <history>Verion: 1.0.0.0 - TRAN_DANG_QUANG</history>
        private void fsReloadGrid()
        {
            CommonLogging.fsWriteLog(CommonConstants.LOG_TYPE_INFO, "frmGroupList.fsReloadGrid", "", "");

            if (cmbGroupList.SelectedValue.ToString() != String.Empty & cmbGroupList.SelectedValue.ToString() != "")
            {
                gridDataSource = masterCtrl.fsGetMasterFromGroupCode(cmbGroupList.SelectedValue.ToString());
                grdItem.DataSource = gridDataSource;
            }
        }

        /// <summary>
        /// Xóa dòng đang được chọn
        /// </summary>
        /// <history>Verion: 1.0.0.0 - TRAN_DANG_QUANG</history>
        private void fsDeleteSelectedRow()
        {
            CommonLogging.fsWriteLog(CommonConstants.LOG_TYPE_INFO, "frmGroupList.fsDeleteSelectedRow", "", "");

            String strIDcode = string.Empty;
            DataGridViewSelectedRowCollection selectedRow;
            selectedRow = grdItem.SelectedRows;

            if (selectedRow.Count > 0)
            {
                strIDcode = grdItem.Rows[selectedRow[0].Index].Cells["colCODE"].Value.ToString();
                if (strIDcode != String.Empty)
                {
                    if (MessageBoxEx.Show(CommonMessages.MSG_DEL_CONFIRM, CommonMessages.MSG_CONFIRM_TITLE, MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes)
                    {
                        if (masterCtrl.fsDeleteMasterItem(strIDcode, DateTime.Now, CommonUtils.fsGetOPID()) == true)
                        {
                            this.fsReloadGrid();
                        }
                        else
                        {
                            MessageBoxEx.Show(CommonMessages.MSG_DEL_FAIL, CommonMessages.MSG_ERR_TITLE, MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                    }
                }
            }
            else
            {
                MessageBoxEx.Show("Không tìm thấy dòng được chọn!", CommonMessages.MSG_ERR_TITLE, MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
            }                    
        }

        /// <summary>
        /// Lưu lại data sau khi người dùng edit
        /// </summary>
        private void fsSaveData()
        {
            CommonLogging.fsWriteLog(CommonConstants.LOG_TYPE_INFO, "frmGroupList.fsSaveData", "", "");
            CommonGlobalVariable.globalDataContext.SubmitChanges();
        }

        #endregion 
    }
}